package dao

import (
	"errors"
	"fmt"
	"github.com/wonderivan/logger"
	"gorm.io/gorm"
	"k8s-platform/db"
	"k8s-platform/model"
)

var K8sDeployHandler k8sDeployHandler

type k8sDeployHandler struct{}

// 列表
func (*k8sDeployHandler) K8s_install_List() ([]*model.K8sDeployConfig, error) {
	k8s_install_list := []*model.K8sDeployConfig{}
	tx := db.DB.Find(&k8s_install_list)
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("获取k8s安装列表失败，%v\n", tx.Error))
		return nil, errors.New(fmt.Sprintf("获取k8s安装列表失败，%v\n", tx.Error))
	}
	return k8s_install_list, nil
}

// 新增
func (*k8sDeployHandler) Create_Deploy_Config(k8sdeploy *model.K8sDeployConfig) error {
	//创建credential
	tx := db.DB.Create(&k8sdeploy)
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("新增部署失败，%v\n", tx.Error))
		return errors.New(fmt.Sprintf("新增部署失败，%v\n", tx.Error))
	}
	return nil
}

func (h *k8sDeployHandler) Has(k8sName string, targetID int64) (*model.K8sDeployConfig, bool, error) {
	data := &model.K8sDeployConfig{}

	// 1. 通过 k8s_name 查询记录
	tx := db.DB.Where("k8s_name = ?", k8sName).First(data)
	if tx.Error != nil {
		// 情况1：记录不存在（k8s_name 未被使用）
		if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
			return nil, true, nil // 返回 true 表示名字可用
		}
		// 情况2：查询出错（如数据库异常）
		errMsg := fmt.Sprintf("查询k8s_Config失败: %v", tx.Error)
		logger.Error(errMsg)
		return nil, false, errors.New(errMsg)
	}

	// 2. 记录存在，判断 ID 是否匹配
	if data.ID == targetID {
		// 情况3：ID 匹配（当前操作的是自己的记录，允许继续）
		return data, true, nil // 返回 true 表示合法
	} else {
		// 情况4：ID 不匹配（k8s_name 已被其他记录占用）
		return nil, false, nil // 返回 false 表示名字冲突
	}
}

// 基于查询单个，用于新增的时候判断是否重复
//func (*k8sDeployHandler) Has(k8s_name string, ID int64) (*model.K8sDeployConfig, bool, error) {
//	data := &model.K8sDeployConfig{}
//
//	tx := db.DB.Where("k8s_name = ?", k8s_name).First(&data)
//	if errors.As(tx.Error, &gorm.ErrRecordNotFound) {
//		return nil, false, nil
//	}
//
//	if tx.Error != nil {
//		logger.Error(fmt.Sprintf("查询k8s_Config失败了, %v\n", tx.Error))
//		return nil, false, errors.New(fmt.Sprintf("查询k8s_Config失败了, %v\n", tx.Error))
//	}
//	return data, true, nil
//}

// // 基于id查询单个，用于查询单个详情
//
//	func (*credential) Get(id int64) (*model.Credential, bool, error) {
//		data := &model.Credential{}
//		tx := db.DB.Where("id = ?", id).Preload("HostServers").First(&data)
//		if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
//			return nil, false, nil
//		}
//		if tx.Error != nil {
//			logger.Error(fmt.Sprintf("查询Credential组失败, %v\n", tx.Error))
//			return nil, false, errors.New(fmt.Sprintf("查询Credential组失败, %v\n", tx.Error))
//		}
//		return data, true, nil
//	}
//

// 更新
func (*k8sDeployHandler) Update_Deploy_Config(config *model.K8sDeployConfig) error {
	//基于ID，更新单条hostgroup的所有数据
	//更新一般是在前端表格中某条数据的更新按钮，能拿到这条数据的所有内容，是list接口返回的
	//所以这里用Updates更新所有字段

	tx := db.DB.Model(&model.K8sDeployConfig{}).Where("id = ?", &config.ID).Updates(&config)
	if tx.Error != nil {
		logger.Error(fmt.Sprintf("更新Update_Deploy_Config失败, %v\n", tx.Error))
		return errors.New(fmt.Sprintf("更新Update_Deploy_Config失败, %v\n", tx.Error))
	}
	return nil
}

// 删除
func (*k8sDeployHandler) Delete_Deploy_Config(Delete int64) error {

	tx := db.DB.Where("id = ?", Delete).Delete(&model.K8sDeployConfig{})
	if tx.Error != nil {
		logger.Error("删除Delete_Deploy_Config失败, " + tx.Error.Error())
		return errors.New("删除Delete_Deploy_Config失败, " + tx.Error.Error())
	}

	return nil
}
